package com.ruoyi.ly.controller;


import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.ly.domain.ServeUser;
import com.ruoyi.ly.domain.WxCode;
import com.ruoyi.ly.mapper.ServeUserMapper;
import com.ruoyi.ly.service.ServeUserService;
import com.ruoyi.ly.utils.Result;
import com.ruoyi.ly.utils.WechatUtil;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@Api(tags = "微信登录接口")
@RequestMapping("/ctnm-ly/wx")
@Slf4j
public class WeChatLoginController {

    @Autowired
    private ServeUserService serveUserService;

    @PostMapping("/login")
    public Result user_login(@RequestBody WxCode wxCode)
                             {

        // 用户非敏感信息：rawData
        // 签名：signature
                                 System.out.println(wxCode.getCode());
        JSONObject rawDataJson = JSON.parseObject(wxCode.getRawData());
        // 1.接收小程序发送的code
        // 2.开发者服务器 登录凭证校验接口 appi + appsecret + code
        JSONObject SessionKeyOpenId = WechatUtil.getSessionKeyOrOpenId(wxCode.getCode());
        // 3.接收微信接口服务 获取返回的参数
        String openid = SessionKeyOpenId.getString("openid");
        String sessionKey = SessionKeyOpenId.getString("session_key");

        System.out.println("openid:"+openid+"sessionKey:"+sessionKey);

        // 4.校验签名 小程序发送的签名signature与服务器端生成的签名signature2 = sha1(rawData + sessionKey)
        String signature2 = DigestUtils.sha1Hex(wxCode.getRawData() + sessionKey);
        if (!wxCode.getSignature().equals(signature2)) {
            return Result.error("签名校验失败");
        }


        // 5.根据返回的User实体类，判断用户是否是新用户，是的话，将用户信息存到数据库
        ServeUser serveUser = serveUserService.selectByOpenId(openid);
        if (serveUser == null) {
            // 用户信息入库
            String nickName = rawDataJson.getString("nickName");
            serveUser = new ServeUser();
            serveUser.setOpenId(openid);
            serveUser.setName(nickName);
            serveUser.setOpenId(openid);

            serveUserService.save(serveUser);
        }
        return Result.success(serveUser);
    }

}
